package order

import (
	"context"
	"encoding/json"
	"fmt"
	"service/api/api"
	"service/model/mod"
	"strconv"
	"strings"

	"github.com/iGoogle-ink/gopay/wechat"

	baseGpb "gitee.com/cloudapex/protos/crm_base/pb"
	gpb "gitee.com/cloudapex/protos/crm_order/pb"
	hrGpb "gitee.com/cloudapex/protos/hr_cache/pb"
	kbGpb "gitee.com/cloudapex/protos/pro_know/pb"
	"gitee.com/cloudapex/ulern/util"
	"github.com/gin-gonic/gin"

	//"gitee.com/cloudapex/ulern/htp"
	"io/ioutil"
	"net/http"
	baseModel "service/model/crm_base"
	model "service/model/crm_order"

	"service/api/assist/tool"
	hrModel "service/model/hr_cache"
	"time"

	"github.com/iGoogle-ink/gopay/alipay"
)

func LcPayNotify(c *gin.Context) {

	var lcReq tool.LcnotifyReq
	s, _ := ioutil.ReadAll(c.Request.Body) //把  body 内容读入字符串 s
	util.Debug("回调信息%s", string(s))
	err := json.Unmarshal(s, &lcReq)
	if err != nil {
		util.Debug("回调信息解析失败%s", err)
		return
	}
	if lcReq.ReturnCode != "01" && lcReq.ResultCode != "01" {
		util.Debug("回调状态异常%s", err)
		return
	}

	util.Debug("支付回调测试")
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	in := &gpb.CrmOrderGetReq{
		BillNo: lcReq.TerminalTrace,
	}
	res, err := model.Order.GetOrderInfo(ctx, in)
	util.Debug("%s", res)
	if err != nil {
		util.Debug("%s", err)
		return
	}
	if res.OrderId == 0 {
		util.Debug(fmt.Sprintf("订单%s不存在", res.BillNo))
		c.JSON(http.StatusOK, gin.H{"err": 2, "msg": "不存在此账单"})
		return
	}

	if res.Status != 1 {
		util.Debug("账单状态不正确")
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "账单状态不正确"})
		return
	}

	req := &hrGpb.LoginCacheReq{
		Id: res.UserId,
	}
	userInfo, err := hrModel.UserCacheServer.GetAllLoginCache(ctx, req)
	util.Debug("%s", userInfo)

	if err != nil {
		util.Debug("%s", err)
		return
	}

	util.Debug("%s", res.Details)
	if len(res.Details) == 0 {
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "订单数据异常"})
		return
	}

	var senior, low OrAgreeType
	var isSenior int64 = 1
	if res.OrderType == 1 {

		for i, v := range res.Details {

			classInfo, err := GetClassInfo(ctx, v.ClassId)
			if err != nil {
				util.Debug("%s", err)
				c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "审核失败,班型信息有误"})
				return
			}

			if classInfo.UpgRade == 1 {
				isSenior = 2
			}

			util.Debug("%s", classInfo)
			senior, low = CreateAgreeSign(ctx, classInfo, i, res.Details)

			if res.BillType != 3 {

				_, err = api.ClassOpenNormal(ctx, v, res, classInfo)
				if err != nil {
					c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "学员中心绑定账单失败"})
					return
				}

			}

		}
	}

	//开通学员账号
	infoReq := &gpb.AccountGetReq{
		Phone: res.Phone,
	}
	infoRes, err := model.StudentInfo.StudentAccountGet(ctx, infoReq)
	util.Debug("%s", infoRes)

	if err != nil {
		util.Debug("%s", err)
		return
	}
	if infoRes.StudentId == 0 {
		accountReq := &gpb.AccountCreateReq{
			Phone:   res.Phone,
			Pass:    util.MD5s(res.Phone),
			Email:   "",
			Address: "",
		}
		model.StudentInfo.StudentAccountCreate(ctx, accountReq)

		util.Debug("开通学员账号成功")
	}

	//统计下单金额  和 下单数量
	if res.TotalPrice > 0 {

		if res.BillType < 3 {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      1,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)

			util.Debug("非定金统计金额")

		} else {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      0,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)

			util.Debug("定金统计金额")
		}
	}

	//订单更新
	updateReq := &gpb.CrmOrderStatusReq{
		OrderId:  res.OrderId,
		PayAt:    time.Now().Unix(),
		RealBill: lcReq.OutTradeNo,
		PayType:  int64(mod.EPayW_SB),
	}

	//updateReq.Status = 2
	////招生
	//if res.RoleId == 1 {
	//
	//	if res.OrderType == 1 {
	//
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId != 0 {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return
	//			}
	//
	//			if res.BillType != 3 {
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//				updateReq.Status = 3
	//			}
	//		}
	//	}
	//
	//} else if res.RoleId == 2 {
	//
	//	if res.OrderType == 1 {
	//
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return
	//		}
	//		if stuRes.CustomerId == 0 {
	//
	//			if res.BillType != 3 {
	//
	//				createReq := &gpb.StudentCreateReq{
	//					CommpId:    res.CommpId,
	//					Phone:      res.Phone,
	//					CustomerId: uint64(res.CustomerId),
	//					Amount:     res.TotalPrice,
	//					UserId:     res.UserId,
	//					UserName:   userInfo.UserInfo.Name,
	//					Senior:     isSenior,
	//				}
	//				_, err := model.StudentOrder.StudentOrderCreate(ctx, createReq)
	//				if err != nil {
	//					util.Debug("创建班主任学员库失败%s", err)
	//					return
	//				}
	//
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, res.UserId, userInfo.UserInfo.Name)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return
	//				}
	//				// 删除工作池
	//				_, err = baseModel.Work.DelWorkPool(ctx, &gpc.BaseReq{Id: uint64(res.CustomerId)})
	//				if err != nil {
	//					util.Debug("删除工作池失败：%s", err)
	//					return
	//				}
	//				updateReq.TeachId = res.UserId
	//				updateReq.Status = 3
	//			}
	//		} else {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return
	//			}
	//
	//			if res.BillType != 3 {
	//				updateReq.Status = 3
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return
	//				}
	//			}
	//		}
	//
	//	}
	//
	//}
	//
	//_, err = model.Order.CrmOrderUpdate(ctx, updateReq)

	err = AssignTeacherAndUpdateOrder(ctx, res, updateReq, isSenior, userInfo)
	if err != nil {
		util.Debug("更新订单状态失败：%s", err)
		return
	}
	util.Debug("更新订单状态")

	if res.BillType != 3 {
		workLoginReq := &baseGpb.WorkLogicReq{
			Id:    uint64(res.CustomerId),
			Logic: 5,
		}
		_, err = baseModel.Work.SetWorkLogic(ctx, workLoginReq)
		if err != nil {
			util.Debug("更新库存状态失败：%s", err)
			return
		}
	}

	if res.BillType == 2 {
		endReq := &gpb.CrmOrderGetReq{
			BillNo: res.BillNo,
		}
		_, err = model.Order.CrmDepositOrderEnded(ctx, endReq)
		if err != nil {
			util.Debug("更新子订单状态失败：%s", err)
			return
		}
	}

	isNeed, _ := OrderIsNeedSign(res.BillNo, ctx)
	util.Debug("订单是否签署协议：%v", isNeed)
	if res.BillType != 3 && isNeed {
		if senior.Pidstr != "" {
			_, err := saveAgree(senior, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)
			}
		}

		if low.Pidstr != "" {
			_, err := saveAgree(low, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)

			}
		}
	}

	//更新库存状态
	logicReq := &baseGpb.PoolLogicReq{
		Id:    uint64(res.CustomerId),
		Logic: 5,
	}
	_, err = baseModel.Base.SetPoolLogic(ctx, logicReq)
	if err != nil {
		util.Debug("%s", err)
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "更新库存失败"})
		return
	}

}

type AliPayServer struct {
	AppId           string  `json:"appId"`
	PrivateKey      string  `json:"privateKey"`
	AliPayPublicKey string  `json:"aliPayPublicKey"`
	NotifyUrl       string  `json:"notifyUrl"`
	Subject         string  `json:"subject"`
	OrderNum        string  `json:"ordernum"`
	Total           float64 `json:"total"`
}

func AliPayNotify(c *gin.Context) {

	fmt.Println(c.Request)
	ok, _ := AliNotifyUrl(c.Request)
	fmt.Println(ok)
	if ok {
		c.String(http.StatusOK, "success")
	}

}

type OrAgreeType struct {
	Type          int64   `json:"type"` //   1未升级班  2 升级班
	Pidstr        string  `json:"pidstr"`
	Cidstr        string  `json:"cidstr"`
	Pname         string  `json:"pname"`
	Cname         string  `json:"cname"`
	TerminalIdStr string  `json:"terminal_id_str"`
	NewSlice      []int64 `json:"new_slice"`
	TerminalIds   []int   `json:"terminal_ids"`
}

func AliNotifyUrl(req *http.Request) (bool, error) {

	util.Debug("进入回调")
	notifyReq, err := alipay.ParseNotifyResult(req)
	if err != nil {
		return false, nil
	}
	ok, err := alipay.VerifySign(tool.AilPay.AliPayPublicKey, notifyReq)
	util.Debug("进入回调%v", ok)
	if !ok {
		util.Debug("验证签名失败%v", ok)
		return false, nil
	}
	util.Debug("%v", notifyReq)
	if len(notifyReq.OutTradeNo) > 20 {
		notifyReq.OutTradeNo = notifyReq.OutTradeNo[0:20]
	}

	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	in := &gpb.CrmOrderGetReq{
		BillNo: notifyReq.OutTradeNo,
	}

	util.Debug("%s", notifyReq.OutTradeNo)

	res, err := model.Order.GetOrderInfo(ctx, in)

	util.Debug("订单详情：%s", res)

	if err != nil {
		util.Debug("%s", err)
		return false, err
	}
	if res.OrderId == 0 {
		util.Debug("该订单不存在")
		return false, nil
	}
	if res.Status != 1 {
		util.Debug("账单状态不正确")
		return false, nil
	}
	ReceiptAmount, _ := strconv.ParseFloat(notifyReq.ReceiptAmount, 64)
	if res.TotalPrice != int64(ReceiptAmount*100) {
		util.Debug("订单金额不正确")
		return false, nil
	}

	userReq := &hrGpb.LoginCacheReq{
		Id: res.UserId,
	}
	userInfo, err := hrModel.UserCacheServer.GetAllLoginCache(ctx, userReq)
	util.Debug("%s", userInfo)

	if err != nil {
		util.Debug("%s", err)
		return false, err
	}

	if len(res.Details) == 0 {
		util.Debug("订单detail 不存在，数据异常")
		return false, nil
	}

	var senior, low OrAgreeType

	var isSenior int64 = 1

	if res.OrderType == 1 {

		for i, v := range res.Details {

			classInfo, err := GetClassInfo(ctx, v.ClassId)
			if err != nil {
				util.Debug("%s", err)
				return false, err
			}
			util.Debug("%s", classInfo)
			if classInfo.UpgRade == 1 {
				isSenior = 2
			}

			senior, low = CreateAgreeSign(ctx, classInfo, i, res.Details)
			if res.BillType != 3 {
				_, err = api.ClassOpenNormal(ctx, v, res, classInfo)
				if err != nil {
					util.Debug("%s", err)
					return false, err
				}
			}

		}

	}

	//开通学员账号
	infoReq := &gpb.AccountGetReq{
		Phone: res.Phone,
	}
	infoRes, err := model.StudentInfo.StudentAccountGet(ctx, infoReq)

	util.Debug("%s", infoRes)

	if err != nil {
		util.Debug("%s", err)
		return false, err
	}
	if infoRes.StudentId == 0 {
		accountReq := &gpb.AccountCreateReq{
			Phone:   res.Phone,
			Pass:    util.MD5s(res.Phone),
			Email:   "",
			Address: "",
		}
		infoRes, err = model.StudentInfo.StudentAccountCreate(ctx, accountReq)
		if err != nil {
			util.Debug("%s", err)
			return false, err
		}
	}

	//统计下单金额  和 下单数量
	if res.TotalPrice > 0 {

		if res.BillType < 3 {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      1,
				TotalPrice: res.TotalPrice,
			}
			_, err = model.Order.CrmOrderStatistic(ctx, statistic)
			if err != nil {
				util.Debug("%s", err)
				return false, err
			}
		} else {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      0,
				TotalPrice: res.TotalPrice,
			}
			_, err = model.Order.CrmOrderStatistic(ctx, statistic)
			if err != nil {
				util.Debug("%s", err)
				return false, err
			}
		}
	}

	//订单更新
	updateReq := &gpb.CrmOrderStatusReq{
		OrderId:  res.OrderId,
		PayAt:    time.Now().Unix(),
		RealBill: notifyReq.TradeNo,
		PayType:  int64(mod.EPayW_ZFB),
	}

	//updateReq.Status = 2
	////招生
	//if res.RoleId == 1 {
	//
	//	util.Debug("招生进入")
	//	if res.OrderType == 1 {
	//
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return false, err
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId != 0 {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return false, err
	//			}
	//
	//			if res.BillType != 3 {
	//
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return false, err
	//				}
	//				updateReq.Status = 3
	//			}
	//
	//		}
	//	}
	//
	//} else if res.RoleId == 2 {
	//
	//	util.Debug("班主任进入")
	//	if res.OrderType == 1 {
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return false, err
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId == 0 {
	//
	//			if res.BillType != 3 {
	//
	//				createReq := &gpb.StudentCreateReq{
	//					CommpId:    res.CommpId,
	//					Phone:      res.Phone,
	//					CustomerId: uint64(res.CustomerId),
	//					Amount:     res.TotalPrice,
	//					UserId:     res.UserId,
	//					UserName:   userInfo.UserInfo.Name,
	//					Senior:     isSenior,
	//					//ProjectId:  rsp.BasePool[0].BaseProject.PId,
	//				}
	//				_, err := model.StudentOrder.StudentOrderCreate(ctx, createReq)
	//				if err != nil {
	//					util.Debug("%s", err)
	//					return false, err
	//				}
	//
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, res.UserId, userInfo.UserInfo.Name)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//
	//				_, err = baseModel.Work.DelWorkPool(ctx, &gpc.BaseReq{Id: uint64(res.CustomerId)})
	//				if err != nil {
	//					util.Debug("删除工作池失败：%s", err)
	//					return false, err
	//				}
	//				updateReq.TeachId = res.UserId
	//				updateReq.Status = 3
	//			}
	//
	//		} else {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return false, err
	//			}
	//			if res.BillType != 3 {
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//				updateReq.Status = 3
	//			}
	//		}
	//
	//	}
	//}
	//_, err = model.Order.CrmOrderUpdate(ctx, updateReq)

	err = AssignTeacherAndUpdateOrder(ctx, res, updateReq, isSenior, userInfo)
	if err != nil {
		util.Debug("%s", updateReq)
		util.Debug("%s", err)
		return false, err
	}

	util.Debug("更新订单状态")

	if res.BillType == 2 {
		endReq := &gpb.CrmOrderGetReq{
			BillNo: res.BillNo,
		}
		_, err = model.Order.CrmDepositOrderEnded(ctx, endReq)
		if err != nil {
			util.Debug("更新子订单状态失败：%s", err)
			return false, err
		}
	}

	isNeed, _ := OrderIsNeedSign(res.BillNo, ctx)
	util.Debug("订单是否签署协议：%v", isNeed)
	if res.BillType != 3 && isNeed {
		if senior.Pidstr != "" {
			_, err := saveAgree(senior, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)
			}
		}

		if low.Pidstr != "" {
			_, err := saveAgree(low, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)

			}
		}
	}

	//更新库存状态
	logicReq := &baseGpb.PoolLogicReq{
		Id:    uint64(res.CustomerId),
		Logic: 5,
	}
	_, err = baseModel.Base.SetPoolLogic(ctx, logicReq)
	if err != nil {
		util.Debug("%s", err)
		return false, err
	}

	if res.BillType != 3 {
		workLoginReq := &baseGpb.WorkLogicReq{
			Id:    uint64(res.CustomerId),
			Logic: 5,
		}
		_, err = baseModel.Work.SetWorkLogic(ctx, workLoginReq)
		if err != nil {
			util.Debug("更新库存状态失败：%s", err)
			return false, err
		}
	}

	return true, nil

}

func WxNotify(c *gin.Context) {
	fmt.Println(c.Request)
	ok, _ := WxNotifyUrl(c.Request)
	fmt.Println(ok)
	if ok != "" {
		c.String(http.StatusOK, "success")
	}
}

func WxNotifyUrl(req *http.Request) (string, error) {

	util.Debug("进入回调")
	notifyReq, err := wechat.ParseNotify(req)
	util.Debug("进入回调%s", notifyReq)
	if err != nil {
		util.Debug("%s", err)
		return "", nil
	}
	// 验签操作
	ok, err := wechat.VerifySign(tool.WxPay.ApiKey, wechat.SignType_MD5, notifyReq)
	if !ok {
		util.Debug("验证签名失败%s", err)
		return "", nil
	}

	if len(notifyReq.OutTradeNo) > 20 {
		notifyReq.OutTradeNo = notifyReq.OutTradeNo[0:20]
	}

	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()
	in := &gpb.CrmOrderGetReq{
		BillNo: notifyReq.OutTradeNo,
	}
	res, err := model.Order.GetOrderInfo(ctx, in)
	util.Debug("%s", res)

	if err != nil {
		util.Debug("%s", err)
		return "", err
	}
	if res.OrderId == 0 {
		util.Debug("该订单不存在")
		return "", nil
	}

	if res.Status != int64(mod.EOrderS_NoPay) {
		util.Debug("账单状态不正确")
		return "", nil
	}

	ReceiptAmount, _ := strconv.ParseFloat(notifyReq.TotalFee, 64)
	util.Debug("返回金额%s", notifyReq.TotalFee)
	if res.TotalPrice != int64(ReceiptAmount) {
		util.Debug("金额不正确")
		return "", nil
	}

	userReq := &hrGpb.LoginCacheReq{
		Id: res.UserId,
	}
	userInfo, err := hrModel.UserCacheServer.GetAllLoginCache(ctx, userReq)
	util.Debug("%s", userInfo)
	if err != nil {
		util.Debug("%s", err)
		return "", err
	}

	if len(res.Details) == 0 {
		return "", nil
	}

	var senior, low OrAgreeType

	var isSenior int64 = 1

	if res.OrderType == 1 {

		for i, v := range res.Details {

			ClassId := v.ClassId
			classInfo, err := GetClassInfo(ctx, ClassId)
			if err != nil {
				util.Debug("%s", err)
				return "", err
			}

			if classInfo.UpgRade == 1 {
				isSenior = 2
			}

			senior, low = CreateAgreeSign(ctx, classInfo, i, res.Details)
			util.Debug("%s", classInfo)

			if res.BillType != 3 {
				_, err = api.ClassOpenNormal(ctx, v, res, classInfo)
				if err != nil {
					util.Debug("%s", err)
					return "", err
				}
			}

		}

	}

	//开通学员账号
	infoReq := &gpb.AccountGetReq{
		Phone: res.Phone,
	}
	infoRes, err := model.StudentInfo.StudentAccountGet(ctx, infoReq)
	if err != nil {
		util.Debug("%s", err)
		return "", err
	}
	if infoRes.StudentId == 0 {
		accountReq := &gpb.AccountCreateReq{
			Phone:   res.Phone,
			Pass:    util.MD5s(res.Phone),
			Email:   "",
			Address: "",
		}
		infoRes, err = model.StudentInfo.StudentAccountCreate(ctx, accountReq)
		if err != nil {
			util.Debug("%s", err)
			return "", err
		}
	}

	//统计下单金额  和 下单数量
	if res.TotalPrice > 0 {
		if res.BillType < 3 {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      1,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)
		} else {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      0,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)
		}
	}

	//订单更新
	updateReq := &gpb.CrmOrderStatusReq{
		OrderId:  res.OrderId,
		PayAt:    time.Now().Unix(),
		RealBill: notifyReq.TransactionId,
		PayType:  int64(mod.EPayW_WX),
	}

	//招生
	//if res.RoleId == 1 {
	//	updateReq.Status = 2
	//	if res.BillType != 3 {
	//
	//		if res.OrderType == 1 {
	//
	//			//班主任的话，直接将学员分配给自己
	//			stuReq := &gpb.StudentOrderGetReq{
	//				Phone: res.Phone,
	//			}
	//			stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//			if err != nil {
	//				util.Debug("%s", err)
	//				return "", err
	//			}
	//			util.Debug("班主任学员库信息：%s", stuRes)
	//
	//			if stuRes.CustomerId != 0 {
	//
	//				changeOrder := &gpb.StudentOrderStatusReq{
	//					Phone:  res.Phone,
	//					Amount: res.TotalPrice + stuRes.Amount,
	//				}
	//				_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//				if err != nil {
	//					util.Debug("更新学员库成交金额失败：%s", err)
	//					return "", err
	//				}
	//				updateReq.TeachId = int64(stuRes.UserId)
	//
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return "", err
	//				}
	//			}
	//		}
	//	}
	//
	//} else if res.RoleId == 2 {
	//
	//	if res.BillType != 3 {
	//
	//		if res.OrderType == 1 {
	//			//班主任的话，直接将学员分配给自己
	//			stuReq := &gpb.StudentOrderGetReq{
	//				Phone: res.Phone,
	//			}
	//			stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//			if err != nil {
	//				util.Debug("%s", err)
	//				return "", err
	//			}
	//			if stuRes.CustomerId == 0 {
	//				createReq := &gpb.StudentCreateReq{
	//					CommpId:    res.CommpId,
	//					Phone:      res.Phone,
	//					CustomerId: uint64(res.CustomerId),
	//					Amount:     res.TotalPrice,
	//					UserId:     res.UserId,
	//					UserName:   userInfo.UserInfo.Name,
	//					Senior:     isSenior,
	//				}
	//				_, err := model.StudentOrder.StudentOrderCreate(ctx, createReq)
	//				if err != nil {
	//					util.Debug("%s", err)
	//					return "", err
	//				}
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, res.UserId, userInfo.UserInfo.Name)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//				// 删除工作池
	//				_, err = baseModel.Work.DelWorkPool(ctx, &gpc.BaseReq{Id: uint64(res.CustomerId)})
	//				if err != nil {
	//					util.Debug("删除工作池失败：%s", err)
	//					return "", err
	//				}
	//				updateReq.TeachId = res.UserId
	//			} else {
	//				changeOrder := &gpb.StudentOrderStatusReq{
	//					Phone:  res.Phone,
	//					Amount: res.TotalPrice + stuRes.Amount,
	//				}
	//				_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//				if err != nil {
	//					util.Debug("更新学员库成交金额失败：%s", err)
	//					return "", err
	//				}
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return "", err
	//				}
	//			}
	//			updateReq.Status = 3
	//		} else {
	//			updateReq.Status = 2
	//		}
	//
	//	} else {
	//		updateReq.Status = 2
	//	}
	//
	//} else {
	//	updateReq.Status = 2
	//}

	//updateReq.Status = 2
	//if res.RoleId == 1 {
	//
	//	util.Debug("招生进入")
	//	if res.OrderType == 1 {
	//
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return "", err
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId != 0 {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return "", err
	//			}
	//
	//			if res.BillType != 3 {
	//
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return "", err
	//				}
	//				updateReq.Status = 3
	//			}
	//
	//		}
	//	}
	//
	//} else if res.RoleId == 2 {
	//
	//	util.Debug("班主任进入")
	//	if res.OrderType == 1 {
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return "", err
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId == 0 {
	//
	//			if res.BillType != 3 {
	//
	//				createReq := &gpb.StudentCreateReq{
	//					CommpId:    res.CommpId,
	//					Phone:      res.Phone,
	//					CustomerId: uint64(res.CustomerId),
	//					Amount:     res.TotalPrice,
	//					UserId:     res.UserId,
	//					UserName:   userInfo.UserInfo.Name,
	//					Senior:     isSenior,
	//					//ProjectId:  rsp.BasePool[0].BaseProject.PId,
	//				}
	//				_, err := model.StudentOrder.StudentOrderCreate(ctx, createReq)
	//				if err != nil {
	//					util.Debug("%s", err)
	//					return "", err
	//				}
	//
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, res.UserId, userInfo.UserInfo.Name)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//
	//				_, err = baseModel.Work.DelWorkPool(ctx, &gpc.BaseReq{Id: uint64(res.CustomerId)})
	//				if err != nil {
	//					util.Debug("删除工作池失败：%s", err)
	//					return "", err
	//				}
	//				updateReq.TeachId = res.UserId
	//				updateReq.Status = 3
	//			}
	//
	//		} else {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return "", err
	//			}
	//			if res.BillType != 3 {
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//				updateReq.Status = 3
	//			}
	//		}
	//
	//	}
	//}
	//
	//_, err = model.Order.CrmOrderUpdate(ctx, updateReq)

	err = AssignTeacherAndUpdateOrder(ctx, res, updateReq, isSenior, userInfo)
	if err != nil {
		util.Debug("更新订单状态失败%s", err)
		return "", err
	}

	if res.BillType == 2 {
		endReq := &gpb.CrmOrderGetReq{
			BillNo: res.BillNo,
		}
		_, err = model.Order.CrmDepositOrderEnded(ctx, endReq)
		if err != nil {
			util.Debug("更新子订单状态失败：%s", err)
			return "", err
		}
	}

	isNeed, _ := OrderIsNeedSign(res.BillNo, ctx)

	util.Debug("订单是否签署协议：%v", isNeed)

	if res.BillType != 3 && isNeed {
		if senior.Pidstr != "" {
			_, err := saveAgree(senior, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)
			}
		}

		if low.Pidstr != "" {
			_, err := saveAgree(low, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)

			}
		}
	}

	//更新库存状态
	logicReq := &baseGpb.PoolLogicReq{
		Id:    uint64(res.CustomerId),
		Logic: 5,
	}
	_, err = baseModel.Base.SetPoolLogic(ctx, logicReq)
	if err != nil {
		util.Debug("%s", err)
		return "", err
	}

	if res.BillType != 3 {
		workLoginReq := &baseGpb.WorkLogicReq{
			Id:    uint64(res.CustomerId),
			Logic: 5,
		}
		_, err = baseModel.Work.SetWorkLogic(ctx, workLoginReq)
		if err != nil {
			util.Debug("更新库存状态失败：%s", err)
			return "", err
		}
	}

	return notifyReq.OutTradeNo, nil

}

func NowNotify(c *gin.Context) {

	s, _ := ioutil.ReadAll(c.Request.Body)
	util.Debug("回调信息%s", string(s))

	strOrder := strings.Split(strings.Trim(string(s), "&"), "&")
	var mhtOrderNo, nowPayOrderNo string
	for _, row := range strOrder {
		order := strings.Split(strings.Trim(row, "="), "=")

		if order[0] == "mhtOrderNo" {
			mhtOrderNo = order[1]
		}
		if order[0] == "nowPayOrderNo" {
			nowPayOrderNo = order[1]
		}
	}

	var senior, low OrAgreeType

	util.Debug("支付回调测试")
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	in := &gpb.CrmOrderGetReq{
		BillNo: mhtOrderNo,
	}
	res, err := model.Order.GetOrderInfo(ctx, in)

	util.Debug("%s", res)

	if err != nil {
		util.Debug("%s", err)
		return
	}
	if res.OrderId == 0 {
		util.Debug("该订单不存在")
		util.Debug("%s", res)
		c.JSON(http.StatusOK, gin.H{"err": 2, "msg": "不存在此账单"})
		return
	}

	if res.Status != 1 {
		util.Debug("账单状态不正确")
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "账单状态不正确"})
		return
	}

	req := &hrGpb.LoginCacheReq{
		Id: res.UserId,
	}
	userInfo, err := hrModel.UserCacheServer.GetAllLoginCache(ctx, req)
	util.Debug("%s", userInfo)

	if err != nil {
		util.Debug("%s", err)
		return
	}

	util.Debug("%s", res.Details)

	var isSenior int64 = 1

	if len(res.Details) == 0 {
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "订单数据异常"})
		return
	}

	if res.OrderType == 1 {

		for i, v := range res.Details {

			classInfo, err := GetClassInfo(ctx, v.ClassId)
			if err != nil {
				util.Debug("%s", err)
				c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "审核失败,班型信息有误"})
				return
			}

			if classInfo.UpgRade == 1 {
				isSenior = 2
			}
			util.Debug("%s", classInfo)

			senior, low = CreateAgreeSign(ctx, classInfo, i, res.Details)

			if res.BillType != 3 {
				_, err = api.ClassOpenNormal(ctx, v, res, classInfo)
				if err != nil {
					util.Debug("%s", err)
					c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "学员中心绑定账单失败"})
					return
				}

			}

		}
	}

	//开通学员账号
	infoReq := &gpb.AccountGetReq{
		Phone: res.Phone,
	}
	infoRes, err := model.StudentInfo.StudentAccountGet(ctx, infoReq)

	util.Debug("%s", infoRes)

	if err != nil {
		util.Debug("%s", err)
		return
	}
	if infoRes.StudentId == 0 {
		accountReq := &gpb.AccountCreateReq{
			Phone:   res.Phone,
			Pass:    util.MD5s(res.Phone),
			Email:   "",
			Address: "",
		}
		model.StudentInfo.StudentAccountCreate(ctx, accountReq)

		util.Debug("开通学员账号成功")
	}

	//统计下单金额  和 下单数量
	if res.TotalPrice > 0 {

		if res.BillType < 3 {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      1,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)

			util.Debug("非定金统计金额")

		} else {
			statistic := &gpb.OrderStatisticsReq{
				CommpId:    res.CommpId,
				Count:      0,
				TotalPrice: res.TotalPrice,
			}
			model.Order.CrmOrderStatistic(ctx, statistic)

			util.Debug("定金统计金额")
		}
	}

	//订单更新
	updateReq := &gpb.CrmOrderStatusReq{
		OrderId:  res.OrderId,
		PayAt:    time.Now().Unix(),
		RealBill: nowPayOrderNo,
		PayType:  int64(mod.EPayW_JH),
	}

	//updateReq.Status = 2
	//if res.RoleId == 1 {
	//
	//	util.Debug("招生进入")
	//	if res.OrderType == 1 {
	//
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId != 0 {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return
	//			}
	//
	//			if res.BillType != 3 {
	//
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//					return
	//				}
	//				updateReq.Status = 3
	//			}
	//
	//		}
	//	}
	//
	//} else if res.RoleId == 2 {
	//
	//	util.Debug("班主任进入")
	//	if res.OrderType == 1 {
	//		//班主任的话，直接将学员分配给自己
	//		stuReq := &gpb.StudentOrderGetReq{
	//			Phone: res.Phone,
	//		}
	//		stuRes, err := model.StudentOrder.StudentOrderGet(ctx, stuReq)
	//		if err != nil {
	//			util.Debug("%s", err)
	//			return
	//		}
	//		util.Debug("班主任学员库信息：%s", stuRes)
	//
	//		if stuRes.CustomerId == 0 {
	//
	//			if res.BillType != 3 {
	//
	//				createReq := &gpb.StudentCreateReq{
	//					CommpId:    res.CommpId,
	//					Phone:      res.Phone,
	//					CustomerId: uint64(res.CustomerId),
	//					Amount:     res.TotalPrice,
	//					UserId:     res.UserId,
	//					UserName:   userInfo.UserInfo.Name,
	//					Senior:     isSenior,
	//					//ProjectId:  rsp.BasePool[0].BaseProject.PId,
	//				}
	//				_, err := model.StudentOrder.StudentOrderCreate(ctx, createReq)
	//				if err != nil {
	//					util.Debug("%s", err)
	//					return
	//				}
	//
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, res.UserId, userInfo.UserInfo.Name)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//
	//				_, err = baseModel.Work.DelWorkPool(ctx, &gpc.BaseReq{Id: uint64(res.CustomerId)})
	//				if err != nil {
	//					util.Debug("删除工作池失败：%s", err)
	//					return
	//				}
	//				updateReq.TeachId = res.UserId
	//				updateReq.Status = 3
	//			}
	//
	//		} else {
	//
	//			changeOrder := &gpb.StudentOrderStatusReq{
	//				Phone:  res.Phone,
	//				Amount: res.TotalPrice + stuRes.Amount,
	//			}
	//
	//			if stuRes.Senior != 2 && isSenior == 2 && res.BillType != 3 {
	//				changeOrder.Senior = isSenior
	//			}
	//
	//			_, err = model.StudentOrder.StudentOrderStatus(ctx, changeOrder)
	//			if err != nil {
	//				util.Debug("更新学员库成交金额失败：%s", err)
	//				return
	//			}
	//			if res.BillType != 3 {
	//				updateReq.TeachId = int64(stuRes.UserId)
	//				err = AddAutoAssignLog(ctx, res.CommpId, res.OrderId, int64(stuRes.UserId), stuRes.UserName)
	//				if err != nil {
	//					util.Debug("添加分配记录失败：%s", err)
	//				}
	//				updateReq.Status = 3
	//			}
	//		}
	//
	//	}
	//}
	//
	//_, err = model.Order.CrmOrderUpdate(ctx, updateReq)

	err = AssignTeacherAndUpdateOrder(ctx, res, updateReq, isSenior, userInfo)
	if err != nil {
		util.Debug("更新订单状态失败：%s", err)
	}

	util.Debug("更新订单状态")

	if res.BillType == 2 {
		endReq := &gpb.CrmOrderGetReq{
			BillNo: res.BillNo,
		}
		_, err = model.Order.CrmDepositOrderEnded(ctx, endReq)
		if err != nil {
			util.Debug("更新子订单状态失败：%s", err)
			return
		}
	}

	isNeed, _ := OrderIsNeedSign(res.BillNo, ctx)

	if res.BillType != 3 && isNeed {
		if senior.Pidstr != "" {
			_, err := saveAgree(senior, res, infoRes, ctx)
			if err != nil {
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)
			}
		}

		if low.Pidstr != "" {
			_, err := saveAgree(low, res, infoRes, ctx)
			if err != nil {
				fmt.Println("订单协议出现错误：")
				util.Debug("订单协议出现错误：")
				util.Debug("%s", err)

			}
		}
	}

	if res.BillType != 3 {
		workLoginReq := &baseGpb.WorkLogicReq{
			Id:    uint64(res.CustomerId),
			Logic: 5,
		}
		_, err = baseModel.Work.SetWorkLogic(ctx, workLoginReq)
		if err != nil {
			util.Debug("更新库存状态失败：%s", err)
			c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "更新库存失败"})
			return
		}
	}

	//更新库存状态
	logicReq := &baseGpb.PoolLogicReq{
		Id:    uint64(res.CustomerId),
		Logic: 5,
	}
	_, err = baseModel.Base.SetPoolLogic(ctx, logicReq)
	if err != nil {
		util.Debug("%s", err)
		c.JSON(http.StatusOK, gin.H{"err": 3, "msg": "更新库存失败"})
		return
	}

}

func AppendSlice(slice []int, aslice []int) []int {

	for _, v := range aslice {
		if !isInSliceNew(v, slice) {
			slice = append(slice, v)
		}
	}
	return slice
}

func IntToString(sli []int) string {

	str := ""
	for k, v := range sli {
		V := strconv.Itoa(v)
		if k == 0 {
			str += V
		} else {
			str += "," + V
		}
	}
	return str
}

func isInSliceNew(v int, sli []int) bool {
	for _, v1 := range sli {

		if v1 == v {
			return true
		}
	}
	return false
}

func saveAgree(agree OrAgreeType, order *gpb.CrmOrderCreateRes, stuInfo *gpb.AccountCreateRes, ctx context.Context) (*gpb.AgreeOrderCreateRes, error) {

	req := &gpb.AgreeOrderCreateReq{
		OrderId:     order.OrderId,
		BillNo:      order.BillNo,
		ProjectId:   agree.Pidstr,
		ClassId:     agree.Cidstr,
		PName:       agree.Pname,
		CName:       agree.Cname,
		StudentId:   stuInfo.StudentId,
		Status:      1,
		UName:       "",
		Phone:       stuInfo.Phone,
		TerminalIds: agree.TerminalIdStr,
		Type:        agree.Type,
	}
	return model.UserClass.AgreeOrderCreate(ctx, req)

}

//订单是否需要签署协议
func OrderIsNeedSign(orderNo string, ctx context.Context) (bool, error) {

	isNeed := false
	in := &gpb.CrmOrderGetReq{
		BillNo: orderNo,
	}
	res, err := model.Order.GetOrderInfo(ctx, in)
	if err != nil || res.OrderId == 0 {
		return false, err
	}
	if len(res.Details) > 0 {
		for _, v := range res.Details {

			classInfo, err := GetClassInfo(ctx, v.ClassId)
			if err != nil {
				util.Debug("%s", err)
				return false, err
			}

			if classInfo.Agreement == 1 {
				continue
			}

			req1 := &gpb.ClassAgreeReq{
				ClassId: classInfo.Id,
			}
			agreement, err := model.UserClass.GetClassGetAgree(ctx, req1)
			util.Debug("%s", agreement)
			if err != nil {
				return false, err
			}

			if agreement.ClassId == 0 {
				continue
			}
			list := FormatTerminalInfo(agreement.TerminalInfo)
			for _, v := range list {
				settingTime, _ := strconv.Atoi(v.SettingTime)
				if res.PayAt > int64(settingTime) {
					isNeed = true
				}
			}
		}
	}

	return isNeed, nil
}

func IsNeedSign(class *kbGpb.Class, ctx context.Context) (bool, []int) {

	terminalIds := make([]int, 0)
	if class.Agreement == 1 {
		return false, nil
	} else {

		req1 := &gpb.ClassAgreeReq{
			ClassId: class.Id,
		}
		res, _ := model.UserClass.GetClassGetAgree(ctx, req1)
		util.Debug("%s", res)
		util.Debug("%s", class)

		if res.ClassId != 0 {

			if res.TerminalInfo == "" {
				return false, nil
			} else {
				list := FormatTerminalInfo(res.TerminalInfo)
				if len(list) > 0 {
					for _, v := range list {
						tid, _ := strconv.ParseInt(v.TerminalId, 10, 64)
						terminalIds = append(terminalIds, int(tid))
					}
					return true, terminalIds
				} else {
					return false, nil
				}
			}
		} else {
			return false, nil
		}
	}
}

type TerminalShowInfo struct {
	Operator    string `json:"operator"`
	SettingTime string `json:"setting_time"`
	TerminalId  string `json:"terminal_id"`
}

func FormatTerminalInfo(str string) []TerminalShowInfo {
	info := make(map[string]map[string]string)
	json.Unmarshal([]byte(str), &info)
	list := make([]TerminalShowInfo, 0)
	for _, v := range info {
		var show TerminalShowInfo
		show.Operator = v["operator"]
		show.SettingTime = v["setting_time"]
		show.TerminalId = v["terminal_id"]
		list = append(list, show)
	}

	return list
}

func isInSlice(v int64, sli []int64) bool {
	for _, v1 := range sli {
		if v1 == v {
			return true
		}
	}
	return false
}
